/* * @(#)FigureAttributes.java 5.1 * */ package CH.ifa.draw.figures; import java.awt.Color; import java.io.IOException; import java.io.Serializable; import java.util.Enumeration; import java.util.Hashtable; import CH.ifa.draw.util.Storable; import CH.ifa.draw.util.StorableInput; import CH.ifa.draw.util.StorableOutput; /** * A container for a figure's attributes. The attributes are stored * as key/value pairs. * * @see Figure */ public class FigureAttributes extends Object implements Cloneable, Serializable { private Hashtable fMap; /* * Serialization support. */ private static final long serialVersionUID = -6886355144423666716L; private int figureAttributesSerializedDataVersion = 1; /** * Constructs the FigureAttributes. */ public FigureAttributes() { fMap = new Hashtable(); } /** * Gets the attribute with the given name. * @returns attribute or null if the key is not defined */ public Object get(String name) { return fMap.get(name); } /** * Sets the attribute with the given name and * overwrites its previous value. */ public void set(String name, Object value) { fMap.put(name, value); } /** * Tests if an attribute is defined. */ public boolean hasDefined(String name) { return fMap.containsKey(name); } /** * Clones the attributes. */ public Object clone() { try { FigureAttributes a = (FigureAttributes) super.clone(); a.fMap = (Hashtable) fMap.clone(); return a; } catch (CloneNotSupportedException e) { throw new InternalError(); } } /** * Reads the attributes from a StorableInput. * FigureAttributes store the following types directly: * Color, Boolean, String, Int. Other attribute types * have to implement the Storable interface or they * have to be wrapped by an object that implements Storable. * @see Storable * @see #write */ public void read(StorableInput dr) throws IOException { String s = dr.readString(); if (!s.toLowerCase().equals("attributes")) throw new IOException("Attributes expected"); fMap = new Hashtable(); int size = dr.readInt(); for (int i=0; i<size; i++) { String key = dr.readString(); String valtype = dr.readString(); Object val = null; if (valtype.equals("Color")) val = new Color(dr.readInt(), dr.readInt(), dr.readInt()); else if (valtype.equals("Boolean")) val = new Boolean(dr.readString()); else if (valtype.equals("String")) val = dr.readString(); else if (valtype.equals("Int")) val = new Integer(dr.readInt()); else if (valtype.equals("Storable")) val = dr.readStorable(); else if (valtype.equals("UNKNOWN")) continue; fMap.put(key,val); } } /** * Writes the attributes to a StorableInput. * FigureAttributes store the following types directly: * Color, Boolean, String, Int. Other attribute types * have to implement the Storable interface or they * have to be wrapped by an object that implements Storable. * @see Storable * @see #write */ public void write(StorableOutput dw) { dw.writeString("attributes"); dw.writeInt(fMap.size()); // number of attributes Enumeration k = fMap.keys(); while (k.hasMoreElements()) { String s = (String) k.nextElement(); dw.writeString(s); Object v = fMap.get(s); if (v instanceof String) { dw.writeString("String"); dw.writeString((String) v); } else if (v instanceof Color) { dw.writeString("Color"); dw.writeInt(((Color)v).getRed()); dw.writeInt(((Color)v).getGreen()); dw.writeInt(((Color)v).getBlue()); } else if (v instanceof Boolean) { dw.writeString("Boolean"); if (((Boolean)v).booleanValue()) dw.writeString("TRUE"); else dw.writeString("FALSE"); } else if (v instanceof Integer) { dw.writeString("Int"); dw.writeInt(((Integer)v).intValue()); } else if (v instanceof Storable) { dw.writeString("Storable"); dw.writeStorable((Storable)v); } else { System.out.println(v); dw.writeString("UNKNOWN"); } } } }